/**
 * 
 */
package com.study.json1;

import org.junit.Test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.JSONSerializer;
import com.alibaba.fastjson.serializer.NameFilter;
import com.alibaba.fastjson.serializer.PascalNameFilter;
import com.alibaba.fastjson.serializer.PropertyPreFilter;

/**
 * 通过SerializeFilter可以使用扩展编程的方式实现定制序列化。fastjson提供了多种SerializeFilter：
 *	PropertyPreFilter 根据PropertyName判断是否序列化；
 *	PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化；
 *	NameFilter 修改Key，如果需要修改Key，process返回值则可；
 *	ValueFilter 修改Value；
 *	BeforeFilter 序列化时在最前添加内容；
 *	AfterFilter 序列化时在最后添加内容。
 * @author Administrator
 * @date 2019年5月3日
 */
public class SerializeFilterTest {

	@Test
	public void PropertyFilterTest() {
        //PropertyFilter filter = new PropertyFilter() {
		PropertyPreFilter filter = new PropertyPreFilter() {
			@Override
			public boolean apply(JSONSerializer serializer, Object object, String name) {
				// 属性是id并且大于等于100时进行序列化
                if ("id".equals(name)) {
                    return true;
                }
                return false;
			}

        };

        User user = new User();
        user.setId(9L);
        user.setName("挖坑埋你");

        String jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
        System.out.println("序列化,id=9：" + jsonString + "\n 修改id的值为200后");

        user.setId(200L);
        jsonString = JSON.toJSONString(user, filter); // 序列化的时候传入filter
        System.out.println("序列化,id=200：" + jsonString);
        
        NameFilter filter1 = new NameFilter() {

            @Override
            public String process(Object object, String name, Object value) {
                // 属性是id是修改id的名字
                if ("id".equals(name)) {
                    return name + "$";
                }
                return name ;
            }
        };
        
        jsonString = JSON.toJSONString(user, filter1); // 序列化的时候传入filter
        System.out.println("修改id属性名后序列化：" + jsonString);
        
        // fastjson内置一个PascalNameFilter，用于输出将首字符大写的Pascal风格
        jsonString = JSON.toJSONString(user, new PascalNameFilter()); // 序列化的时候传入filter
        System.out.println("PascalNameFilter序列化：" + jsonString + "\n");
        //PascalNameFilter序列化：{"Id":200,"Name":"挖坑埋你"}
    }

	
}



class User {

    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
}